VIM 圆括号引用

/\v<(\w+)\_s+\1>

说明:

字符 意义
\v 打开 very magic 开关
< 限定单词开头
() 方便用于后面的引用.
\w+ 一个单词或多个单词
\_s 一个或多个 行尾
\1 引用 第一个 括号.
\0 引用整个匹配

::: alert-info

使用圆括号,但不捕获其内容

有时只想使用圆括号的分组功能,但并不关心捕获的子匹配。例如,可以使用以下模式来匹配我名字的两种形式。

➾ /\v(And|D)rew Neil

这一次使用圆括号的目的在于匹配“Andrew”或者“Drew”,但可能并不想捕获位于圆括号内部的“And或D”。可以在圆括号前面加上% ,指示Vim不要将括号内的内容赋给寄存器 \1,就像这样。

➾ /\v%(And|D)rew Neil

运行结果与之前相比有区别么?当然,速度比原来快了一点,只是你可能察觉不到。但如果你发现自己经常会用到多组圆括号,这种方法就很有用处了。还以处理我名字的两种形式为例,假设想把所有的名和姓替换为姓和名。可以这样做:

➾ /\v(%(And|D)rew) (Neil)
➾ :%s//\2, \1/g

该查找模式会把“Andrew”或者“Drew”赋给寄存器 \1,而把“Neil”赋给寄存器 \2。如果有对第二组圆括号使用 %() ,便会得到无用的文本片段,从而扰乱替换域。
:::